# -*- coding: utf-8 -*-
"""
乒乓球培训管理系统 - 球台表单

球台管理相关的表单定义
包括球台创建、编辑、搜索等表单
"""

from flask_wtf import FlaskForm
from wtforms import (
    StringField, TextAreaField, SelectField, IntegerField,
    DecimalField, BooleanField, SubmitField, HiddenField
)
from wtforms.validators import (
    DataRequired, Length, NumberRange, Optional, ValidationError
)
from flask_login import current_user
from sqlalchemy import and_
from app.models.table import Table
from app.models.campus import Campus


def safe_int_coerce(value):
    """
    安全的整数转换函数，用于处理 SelectField 的 coerce 参数
    能够处理空字符串、None 和数字字符串

    Args:
        value: 要转换的值

    Returns:
        int or None: 转换后的整数或 None
    """
    if value is None or value == '' or value == 'None':
        return None
    try:
        return int(value)
    except (ValueError, TypeError):
        return None


class TableCreateForm(FlaskForm):
    """
    球台创建表单
    """
    name = StringField(
        '球台名称',
        validators=[
            DataRequired(message='球台名称不能为空'),
            Length(2, 20, message='球台名称长度应为2-20个字符')
        ],
        render_kw={'placeholder': '例如：1号台、A台等'}
    )

    campus_id = SelectField(
        '所属校区',
        coerce=safe_int_coerce,
        validators=[DataRequired(message='请选择所属校区')],
        choices=[],
        render_kw={'class': 'form-select'}
    )

    status = SelectField(
        '球台状态',
        choices=[
            ('available', '可用'),
            ('maintenance', '维护中'),
            ('disabled', '禁用')
        ],
        default='available',
        validators=[DataRequired(message='请选择球台状态')],
        render_kw={'class': 'form-select'}
    )

    is_active = BooleanField(
        '启用状态',
        default=True,
        description='取消勾选将禁用此球台'
    )

    submit = SubmitField('添加球台')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 根据用户角色设置校区选项
        if current_user.is_super_admin():
            # 超级管理员可以看到所有校区
            campuses = Campus.query.all()  
            self.campus_id.choices = [
                (campus.id, campus.name) for campus in campuses
            ]
        elif current_user.is_campus_admin():
            # 校区管理员只能管理自己的校区
            if current_user.campus_id:
                campus = Campus.query.get(current_user.campus_id)
                if campus:
                    self.campus_id.choices = [(campus.id, campus.name)]
                    self.campus_id.data = campus.id
                else:
                    self.campus_id.choices = []
            else:
                self.campus_id.choices = []
        else:
            self.campus_id.choices = []

    def validate_name(self, field):
        """验证球台名称在同一校区内是否重复"""
        campus_id = self.campus_id.data
        if campus_id:
            existing_table = Table.query.filter(
                and_(
                    Table.campus_id == campus_id,
                    Table.name == field.data,
                    Table.status != 'deleted'
                )
            ).first()
            if existing_table:
                raise ValidationError('该校区已存在同名球台，请选择其他名称')

    def validate_campus_id(self, field):
        """验证校区选择权限"""
        if not field.data:
            raise ValidationError('请选择所属校区')

        campus = Campus.query.get(field.data)
        if not campus:
            raise ValidationError('选择的校区不存在')

        # 校区管理员只能在自己的校区创建球台
        if current_user.is_campus_admin():
            if current_user.campus_id != field.data:
                raise ValidationError('您只能在自己管理的校区创建球台')


class TableEditForm(TableCreateForm):
    """
    球台编辑表单
    继承创建表单，调整验证逻辑
    """
    table_id = HiddenField()
    submit = SubmitField('保存修改')

    def __init__(self, table=None, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.table = table

        if table:
            self.table_id.data = table.id
            # 编辑时，校区不能修改（或者只有超级管理员可以修改）
            if not current_user.is_super_admin():
                # 校区管理员不能修改校区
                if table.campus:
                    self.campus_id.choices = [(table.campus.id, table.campus.name)]
                    self.campus_id.data = table.campus.id

    def validate_name(self, field):
        """验证球台名称在同一校区内是否重复（排除当前球台）"""
        campus_id = self.campus_id.data
        if campus_id and self.table:
            existing_table = Table.query.filter(
                and_(
                    Table.campus_id == campus_id,
                    Table.name == field.data,
                    Table.id != self.table.id,
                    Table.status != 'deleted'
                )
            ).first()
            if existing_table:
                raise ValidationError('该校区已存在同名球台，请选择其他名称')


class TableSearchForm(FlaskForm):
    """
    球台搜索表单
    """
    keyword = StringField(
        '关键词',
        validators=[Optional()],
        render_kw={'placeholder': '搜索球台名称'}
    )

    campus_id = SelectField(
        '校区',
        coerce=safe_int_coerce,
        choices=[],
        validators=[Optional()],
        render_kw={'class': 'form-select'}
    )

    status = SelectField(
        '状态',
        choices=[
            ('', '全部状态'),
            ('available', '可用'),
            ('maintenance', '维护中'),
            ('disabled', '禁用')
        ],
        validators=[Optional()],
        render_kw={'class': 'form-select'}
    )

    sort_by = SelectField(
        '排序方式',
        choices=[
            ('created_at_desc', '创建时间（新到旧）'),
            ('created_at_asc', '创建时间（旧到新）'),
            ('name_asc', '球台名称（A-Z）'),
            ('name_desc', '球台名称（Z-A）')
        ],
        default='created_at_desc',
        validators=[Optional()],
        render_kw={'class': 'form-select'}
    )

    submit = SubmitField('搜索')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 根据用户角色设置校区选项
        if current_user.is_super_admin():
            # 超级管理员可以看到所有校区
            campuses = Campus.query.all()  
            self.campus_id.choices = [('', '全部校区')] + [
                (campus.id, campus.name) for campus in campuses
            ]
        elif current_user.is_campus_admin():
            # 校区管理员只能看到自己的校区
            if current_user.campus_id:
                campus = Campus.query.get(current_user.campus_id)
                if campus:
                    self.campus_id.choices = [('', '全部校区'), (campus.id, campus.name)]
                else:
                    self.campus_id.choices = [('', '全部校区')]
            else:
                self.campus_id.choices = [('', '全部校区')]
        else:
            self.campus_id.choices = [('', '全部校区')]


class TableBatchForm(FlaskForm):
    """
    球台批量操作表单
    """
    table_ids = HiddenField(validators=[DataRequired(message='请选择要操作的球台')])
    action = SelectField(
        '批量操作',
        choices=[
            ('available', '设为可用'),
            ('maintenance', '设为维护'),
            ('disabled', '设为禁用'),
            ('delete', '删除')
        ],
        validators=[DataRequired(message='请选择操作类型')],
        render_kw={'class': 'form-select'}
    )
    submit = SubmitField('执行操作')

    def validate_table_ids(self, field):
        """验证选择的球台ID"""
        try:
            ids = [int(id.strip()) for id in field.data.split(',') if id.strip()]
            if not ids:
                raise ValidationError('请选择要操作的球台')

            # 验证球台是否存在且用户有权限操作
            tables = Table.query.filter(Table.id.in_(ids)).all()
            if len(tables) != len(ids):
                raise ValidationError('选择的球台中包含无效数据')

            # 校区管理员只能操作自己校区的球台
            if current_user.is_campus_admin():
                for table in tables:
                    if table.campus_id != current_user.campus_id:
                        raise ValidationError('您只能操作自己校区的球台')

        except ValueError:
            raise ValidationError('球台ID格式不正确')


class TableDeleteForm(FlaskForm):
    """
    球台删除确认表单
    """
    table_id = HiddenField(validators=[DataRequired()])
    confirm_text = StringField(
        '确认删除',
        validators=[
            DataRequired(message='请输入确认文本'),
        ],
        render_kw={'placeholder': '请输入"删除"以确认操作'}
    )
    submit = SubmitField('确认删除', render_kw={'class': 'btn btn-danger'})

    def validate_confirm_text(self, field):
        """验证确认文本"""
        if field.data != '删除':
            raise ValidationError('请正确输入"删除"以确认操作')


class TableStatusForm(FlaskForm):
    """
    球台状态快速切换表单
    """
    table_id = HiddenField(validators=[DataRequired()])
    status = SelectField(
        '新状态',
        choices=[
            ('available', '可用'),
            ('maintenance', '维护中'),
            ('disabled', '禁用')
        ],
        validators=[DataRequired(message='请选择状态')],
        render_kw={'class': 'form-select'}
    )
    submit = SubmitField('更新状态')